【アップデート】AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになりました! #AWSreInvent

【アップデート】AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになりました! #AWSreInvent

AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになりました!
Clock Icon2024.12.02

お疲れさまです。とーちです。

AWS re:Invent 2024 もうすぐ始まりますね。
re:Invent前ということもあり大量のアップデートが発表されています。
今日はその中から、「AWS announces access to VPC resources over AWS PrivateLink」というアップデートを詳解します。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/access-vpc-resources-aws-privatelink/

とりあえずまとめ

  • AWS PrivateLink(以下PrivateLink)が進化し、NLBやGateway Load Balancerなしで、VPCリソースへの直接的なプライベートアクセスが可能に
  • PrivateLink経由で通信させるには Resource configurationResource gateway が必要

何が変わったのか

従来のAWS PrivateLinkで、他VPCからEC2などのVPC内リソースにアクセスさせるためには宛先VPC側のアクセスさせたいリソースの前段にNLBなどを置きそれを経由させる必要がありました。絵にすると以下のような形です。

image.png

今回のアップデートにより以下のようにNLBなしで直接、通信が実現出来るようになりました。

image.png

私が思いつく嬉しいユースケースとしてはRDS接続でしょうか?従来、別VPCのRDSに接続するためにはVPCピアリングやTransitGatewayを使ってVPC間で通信が出来る状態にする必要がありました。
今回のアップデートでNLB等を置かずに直接別VPCのRDSに接続できるようになったのでVPC間でIPアドレスレンジが重複しているようなケースでもシンプルにアクセスできるようになったのが嬉しいですね。

試してみた

それではさっそく試してみようと思います。
今回はシンプルに1つのAWSアカウント内に2つのVPCを立てて通信をさせる以下の構成で試してみます。

image.png

まず、VPCを2つ用意します。あえてVPC CIDRを被らせてみました。

image.png

PrivateLink作成前のネットワークはシンプルに以下のような形です。両方のVPCはまったく同じ構成にしています。

image.png

次にそれぞれのVPCのPrivateSubnetにEC2を立てます。EC2にはnginxをインストールし80番ポートでアクセスするとページを返すようにしておきました。

image.png

EC2はそれぞれ、各VPCのPrivateSubnetに立てています。

  • image.png
  • image.png

この状態で、VPCリソースエンドポイント用のPrivateLinkを作成してみます。
前段として Resource configuration を作る必要があります。自分はここでしばらく悩みました。またResource configurationを作成するには Resource gateway という設定も作成する必要があります。
Resource gatewayは文字通りResource configurationで指定したリソースのGatewayとしての役割を持っており、PrivateLinkを通ってきた通信はまず、Resource gatewayで受信され、Resource gatewayから最終的な通信先リソース(今回の例でいうと、送信先のEC2)へ送信されます。
絵で表すと以下のような形です。

image.png

それでは設定していきましょう。

  1. まずはVPC Endpoint用のセキュリティグループとResource gateway用のセキュリティグループを作成しておきます。今回はそれぞれ以下のような設定にしました。
    1. VPC Endpoint用のセキュリティグループ
      1. VPC1のCIDRからの80番ポートの通信を許可
    2. Resource gateway用のセキュリティグループ
      1. VPC1のCIDRからの80番ポートの通信を許可
    3. EC2_Bのセキュリティグループ
      1. Resource gateway用のセキュリティグループからの80番ポートの通信を許可
  2. マネージメントコンソールからVPCの画面にいき、PrivateLink and Latticeの Resource gateways を選択し Create resource gateway を押す
    1. image.png
  3. Resource gatewayの設定を行う。今回は以下のようにしてみました
    • Resource gateway name: privatelink-dev2-vpc-rscgw
    • IPアドレスタイプ:ipv4
    • vpc: VPC2
    • subnet: VPC2の各AZのPrivateサブネットを選択
    • セキュリティグループ: 事前に作成したResource gateway用のセキュリティグループ
  4. VPC画面のPrivateLink and Latticeの Resource configurations を選択し Create resource configuration を押す
  5. Resouce confugurationの設定を行う。今回は以下のようにしてみました
    • 名前: privatelink-dev2-vpc-cfg
    • Configuration type: Resource
    • Type: Single
    • プロトコル: TCP
    • Resource gateway: 上記で作成したもの
    • Resource type: IP resource
      • IPアドレス: EC2_BのプライベートIPを指定
    • ポートレンジ:1~65535
    • Association settings: Allow
    • ※最初、DNS resourceとしてEC2に割り振られるプライベートIP DNS名(ip-172-18-0-***.ap-northeast-1.compute.internal)を入れたのですがこれはエラーとなったのでDNS名で登録する場合はもう少し何か設定が必要なようです
  6. VPC画面のPrivateLink and Latticeの エンドポイント を選択し エンドポイントを作成 を押す
  7. エンドポイントの設定を行う。以下のような設定にしました
    • 名前タグ: privatelink-rsc-vpcendpoint
    • タイプ: リソース
    • リソース設定: 上記で作成したResouce confugurationを指定
    • ネットワーク設定:
      • VPC:VPC1
        • DNS名を有効化: 有効
      • サブネット: VPC1の各AZのPrivateサブネットを選択
      • セキュリティグループ:事前に作成したVPC Endpoint用のセキュリティグループ

以上で設定は完了です。それではアクセスしてみます。
EC2_Aに接続しEC2_AからVPCエンドポイントの各ネットワークインターフェースのプライベートIP(172.18.1.70,172.18.0.247)に対してcurlを実行しています

root@ip-172-18-0-108:~# curl 172.18.1.70
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ip-172-18-0-108:~# 
root@ip-172-18-0-108:~# curl 172.18.0.247
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ip-172-18-0-108:~# 

なお、VPCエンドポイントに対してAWSがデフォルトでプライベートDNS名を振ってくれるわけではないようです。このあたりは、Resouce confugurationにてDNS resourceとして登録することでDNS名によるアクセスをさせるのかもしれません。機会があったら試そうと思います。

まとめ

AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになったというアップデートの紹介でした。
正直もう少しシンプルに設定できると思っていたので、Resource configuration等が必要だと分かったときは面食らいましたが、NLBが不要になることによるコストメリットやRDSへの接続がしやすくなったという点は見逃せないと思います。気になる方はぜひお試し頂ければと思います。

以上、とーちでした。

ご参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.